package dao;

import org.hibernate.Session;

/**
 * Define el comportamiento principal del DAO - Data Access Object
 * @author DiegoAlejandro
 *
 */
public interface DAO {
	/**
	 * Obtiene una nueva sesión para ser usda por el DAO
	 * @return session
	 * @throws Exception. Si se produce una excepcion se logea
	 */
	public Session getSession() throws Exception;
	
	/**
	 * Cierra una sesión. Si se poroduce una excpecion la loguea
	 * @param session
	 * @throws Exception
	 */
	public void close(Session session) throws Exception;
	
	/**
	 * Guarda un objeto
	 * @param t
	 * @return id
	 * @throws Exception
	 */
	public <T> Long save( T t ) throws Exception;
	
	/**
	 * Actualiza un objeto en la base de datos. 
	 * @param t
	 * @return el objeto actualizado
	 * @throws Exception
	 */
	public <T> T update(T t) throws Exception;
	
	/**
	 * Elimina un objeto de la base de datos
	 * @param t
	 * @return true si se eliminó, false de lo contrario
	 * @throws Exception
	 */
	public <T> boolean delete(T t) throws Exception;
	
	/**
	 * Obtiene desde la base de datos a partir de su ID
	 * @param id
	 * @param clazz
	 * @return objeto si lo encuentra, null de lo contrario
	 * @throws Exception
	 */
	public <T> T getById(Long id, Class<T> clazz) throws Exception;
	
}
